#
# \brief  Rule for populating an archive by evaluating a content.mk file
# \author Norman Feske
# \date   2017-03-17
#
# This file complements 'create.inc' for the creation of API and source
# archives.
#
# Arguments:
#
#   RECIPE_DIR        - location of the recipe for the source or API archive
#   DEPOT_ARCHIVE_DIR - archive destination within the depot
#   TAG_FILE          - file within archive used as tag for make dependencies
#   GENODE_DIR        - root of the Genode source tree
#   REP_DIR           - source repository where 'RECIPE_DIR' is located
#

#
# Validate existance of a content.mk file for the archive recipe
#
ifneq ($(RECIPE_DIR),)
EXPECTED_CONTENT_MK_FILE := $(RECIPE_DIR)/content.mk
CONTENT_MK_FILE          := $(wildcard $(EXPECTED_CONTENT_MK_FILE))
endif

checked_content_mk_exists: checked_recipe_is_unique
ifeq ($(CONTENT_MK_FILE),)
	@$(ECHO) "Error: Recipe misses content.mk file,\n" \
	          "      expected at '$(EXPECTED_CONTENT_MK_FILE)'"; false
endif

$(TARGET) $(DEPOT_ARCHIVE_DIR)/$(TAG_FILE): checked_content_mk_exists

#
# Handle the creation of the TAG_FILE (and the population of the archive
# directory as its side effect) as an atomic step. Otherwise a dependent
# rule - in particular the rule for generating the hash - could be
# triggered as soon as the specific tag file appears but before the entire
# sub make is finished with populating the archive directory.
#
.NOTPARALLEL: $(DEPOT_ARCHIVE_DIR)/$(TAG_FILE) $(DEPOT_ARCHIVE_DIR).hash

#
# Assemble archive content by invoking the recipe's content.mk file
#
# If an error (such as a missing installation of a port) occurs during this
# step, remove the incomplete archive before returning an error.
#
QUIET := $(if $(VERBOSE),--quiet)
$(DEPOT_ARCHIVE_DIR)/$(TAG_FILE): $(CONTENT_MK_FILE)
	$(VERBOSE)$(MAKE) $(QUIET) -f $(GENODE_DIR)/tool/depot/mk/content_env.mk \
	                           -C $(DEPOT_ARCHIVE_DIR) \
	                           CONTENT_MK=$< \
	                           GENODE_DIR=$(GENODE_DIR) \
	                           REP_DIR=$(REP_DIR) \
	                           CONTRIB_DIR=$(GENODE_DIR)/contrib || \
	( rm -r $(DEPOT_ARCHIVE_DIR); false )
	$(VERBOSE)find $(DEPOT_ARCHIVE_DIR) \( -name "*~" \
	                                   -or -name "*.rej" \
	                                   -or -name "*.orig" \
	                                   -or -name "*.swp" \) -delete

